#include <iostream>
using namespace std;

// 1:类模板
template <class T>
class point
{
public:
    point() : _x(0), _y(0) {}
    point(T x, T y) : _x(x), _y(y) {}
    // T getX()const {_x = _y;return _x;}//这里加了const修饰，所以不能被修改
    T getX()
    {
        _x = _y;
        return _x;
    }

private:
    T _x;
    T _y;
};
// 1.1:第二种实现
// #define T int
// class point2
// {
// public:
//     point2() : _x(0), _y(0) {}
//     point2(T x, T y) : _x(x), _y(y) {}

// private:
//     T _x;
//     T _y;
// };


// 1.2：可以把类模板和函数模板结合起来，定义一个含有成员函数模板的类模板
template <class T>
class point3
{
public:
    point3():_x(0),_y(0){}
    point3(T x,T y):_x(x),_y(y){}
    template<class U>
        void print(U x);//注意这里是函数的声明

private:
    T _x;
    T _y;
};

//函数的实现在类外
template<class T>
template<class U>
void point3<T>::print(U x){
    cout<<this->_x + x<<endl;
}

int main()
{
    point3 p(2,2);
    p.print(3.14);//因为是函数模板，所以交给编译器自己去推导类型









    // point t(1, 3);          // int
    // point t2("abc", "111"); // char
   // cout << t.getX() << endl;
    return 0;
}